﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DAplicaciones1;



namespace interfaz
{
    public partial class FormDisplayItems : Form
    {
        private Sistema sistema;
        private bool esPrimeraVez = true;
        private bool esNodoValidoTildar = false;
        private List<Componente> listaComponentes = new List<Componente>();

        public FormDisplayItems()
        {
            InitializeComponent();
            sistema = Sistema.GetSistema();
            cargarTreeView(typeof(Libro));
        }
        
        public void cargarTreeView(Type tipo)
        {
            treeItems.Nodes.Clear();
            TreeNode node_agregado;
            TreeNode nodeTiempo = null;
            foreach (Item item in sistema.Items)
            {
                string nombre_final;
                if (item.GetType() == tipo)
                {                    
                    TreeNode node = new TreeNode();
                    nombre_final = item.Nombre;
                    node.Tag = item.Nombre;
                    for (int i = (item.Nombre.Length + item.Precio.ToString().Length); i < 38; i++)
                    {
                        nombre_final += " ";
                    }
                    
                    node.Text = nombre_final + item.Precio;
                    foreach (Agregado agregado in item.Agregados)
                    {

                        node_agregado = new TreeNode();
                        string nombre_display="";

                        if (agregado.GetType()==typeof(AccesoOnline))
                        {
                                nombre_display = "Acceso Online";
                                node_agregado.Tag = "AccesoOnline";
                         }
                        if (agregado.GetType()==typeof(ContenidoRelacionado))
                        {
                                nombre_display = "Contenido Relacionado";
                                node_agregado.Tag = "ContenidoRelacionado";
                        }

                        if (agregado.GetType() == typeof(TiempoEntrega))
                        {
                            nombre_display = "Tiempo de entregas";
                            node_agregado.Tag = "TiempoEntrega";
                            nodeTiempo = node_agregado;
                        }
                        
                        nombre_final = nombre_display;
                        for (int i = (nombre_display.Length + agregado.Precio.ToString().Length); i < 35; i++)
                        {
                            nombre_final += " ";
                        }
                        node_agregado.Text = nombre_final + agregado.Precio;
                        node.Nodes.Add(node_agregado);
                    }

                    //Agrego los tiempos de entrega
                    if (nodeTiempo != null)
                    {
                        foreach (Tiempo tiempo in sistema.Tiempos)
                        {

                            node_agregado = new TreeNode();
                            node_agregado.Tag = tiempo.Dias.ToString();
                            nombre_final = tiempo.Dias.ToString();
                            for (int i = (tiempo.Dias.ToString().Length + tiempo.Precio.ToString().Length); i < 32; i++)
                            {
                                nombre_final += " ";
                            }
                            node_agregado.Text = nombre_final + tiempo.Precio.ToString();
                            nodeTiempo.Nodes.Add(node_agregado);
                        }                        
                    }
                    //Agrego el gift
                    Gift gift = devolverGiftPorPrecio(item.Precio);
                    if (gift != null)
                    {
                        node_agregado = new TreeNode();
                        
                        if (gift.Item == null)
                        {
                            node_agregado.Tag = gift.Descripcion;
                            nombre_final = "Gift - " + gift.Descripcion;
                            for (int i = (gift.Descripcion.Length + 7 + gift.Precio.ToString().Length); i < 35; i++)
                            {
                                nombre_final += " ";
                            }
                        }
                        else
                        {
                            node_agregado.Tag = gift.Item.Nombre;
                            nombre_final = "Gift - " + gift.Item.Nombre;
                            for (int i = (gift.Item.Nombre.Length + 7 + gift.Precio.ToString().Length); i < 35; i++)
                            {
                                nombre_final += " ";
                            }
                        }
                        node_agregado.Text = nombre_final + gift.Precio;
                        node.Nodes.Add(node_agregado);
                    }

                    treeItems.Nodes.Add(node);
                }
            }
        }

        private Gift devolverGiftPorPrecio(double p)
        {
            if ((sistema.ArrGifts[0] != null) && (sistema.ArrGifts[1] != null) && (sistema.ArrGifts[2]!= null))
            {
                if ((p >= sistema.ArrGifts[0].RangoBase) && (p <= sistema.ArrGifts[0].RangoTope))
                    return sistema.ArrGifts[0];

                if ((p >= sistema.ArrGifts[1].RangoBase) && (p <= sistema.ArrGifts[1].RangoTope))
                    return sistema.ArrGifts[1];

                if ((p >= sistema.ArrGifts[2].RangoBase) && (p <= sistema.ArrGifts[2].RangoTope))
                    return sistema.ArrGifts[2];
            }
            return null;
        }

        private bool validarNodos(TreeNode nodo)
        {
            if (nodo.Parent!=null)
                if (nodo.Parent.Tag.ToString()== "TiempoEntrega")
                {
                    foreach (TreeNode nodoTiempo in nodo.Parent.Nodes)
                    {
                        if (nodoTiempo.Text != nodo.Text && nodoTiempo.Checked)
                        {
                            return false;
                        }
                    }
                    return true;
                }
             return true;
        }



        private void uncheckallchildren(TreeNode node)
        {
            if (node.Checked == true)
            {
                node.Checked = false;
            }
            foreach (TreeNode childnode in node.Nodes)
            {
                if (childnode.Checked == true)
                {
                    childnode.Checked = false;
                    uncheckallchildren(childnode);
                }
            }
            verificaSiEsElUltimoNodo(node);
        }
        private void verificaSiEsElUltimoNodo(TreeNode nodo)
        {
            bool esUltimo = true;
            if (nodo.Parent != null)
            {
                foreach (TreeNode nod in nodo.Parent.Nodes)
                {
                    if (nod.Checked == true && nod.Text != nodo.Text)
                    {
                        esUltimo = false;
                    }
                }
                if ((esUltimo) && nodo.Parent.Checked == true)
                {
                    nodo.Parent.Checked = false;
                }
            }
        }
        private void checkParent(TreeNode node)
        {

            if (esPrimeraVez)
            {
                esPrimeraVez = false;
                if (node.Nodes.Count == 0)
                {
                    esNodoValidoTildar = true;
                }
            }
            if (node.Parent != null && esNodoValidoTildar)
            {
                node.Parent.Checked = true;
            }
            else
            {
                if (!esNodoValidoTildar)
                    uncheckallchildren(node);
            }
            esPrimeraVez = true;
            esNodoValidoTildar = false;
        }



        private void treeItems_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Checked)
            {

                if (validarNodos(e.Node))
                {

                    checkParent(e.Node);

                }
                else
                {
                    e.Node.Checked = false;
                    MessageBox.Show("No se puede seleccionar 2 tiempos de entrega para un mismo item", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else
            {
                uncheckallchildren(e.Node);
            }


        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            FormMenu menu = new FormMenu();
            menu.Show();
            this.Visible = false;
        }


        private void btnSiguiente_Click(object sender, EventArgs e)
        {

            if (listaComponentes.Count>0){
                FormConfirmacionCompra confirmacion = new FormConfirmacionCompra(listaComponentes);
                this.Visible = false;
                confirmacion.ShowDialog();
            }else
                MessageBox.Show("No seleccionó ningun item para comprar", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

        }

        private void rbnCd_CheckedChanged(object sender, EventArgs e)
        {
            cargarTreeView(typeof(Cd));
        }

        private void rbnDvd_CheckedChanged(object sender, EventArgs e)
        {
            cargarTreeView(typeof(Dvd));
        }

        private void rbnLibro_CheckedChanged(object sender, EventArgs e)
        {
            cargarTreeView(typeof(Libro));
        }

        private void rbnMagazine_CheckedChanged(object sender, EventArgs e)
        {
            cargarTreeView(typeof(Magazine));
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            
            Agregado agregadoAnterior;
            Agregado agregadoCopia;
            bool tieneOtroAgregado = false;

            foreach (TreeNode nodo in treeItems.Nodes)
            {
                agregadoAnterior = null;
                agregadoCopia = null;
                tieneOtroAgregado = false;
                if (nodo.Checked)
                {
                    Item item = sistema.retornaItem(nodo.Tag.ToString());
                    item.Precio = calcularDescuento(item.precio);

                    /**/
                    bool valido = false;
                    foreach (TreeNode childNode in nodo.Nodes)
                    {
                        if ((childNode.Tag.ToString() == "AccesoOnline") && (childNode.Checked))
                        {
                            valido = true;
                        }
                        if (childNode.Tag.ToString() == "TiempoEntrega")
                        {
                            foreach (TreeNode childNodeTiempo in childNode.Nodes)
                            {
                                if (childNodeTiempo.Checked)
                                {
                                    valido = true;
                                }
                            }
                        }
                    }
                    /**/

                    if (valido)
                    {





                        foreach (TreeNode childNode in nodo.Nodes)
                        {
                            if (childNode.Checked)
                            {
                                switch (childNode.Tag.ToString())
                                {
                                    case "AccesoOnline":
                                        agregadoCopia = sistema.retornaAgregadoParaItem(nodo.Tag.ToString(), typeof(AccesoOnline));
                                        agregadoCopia.Precio = calcularDescuento(agregadoCopia.Precio);
                                        agregadoCopia.SetComponent(item);
                                        agregadoAnterior = agregadoCopia;
                                        tieneOtroAgregado = true;
                                        break;
                                    case "TiempoEntrega":
                                        {
                                            try
                                            {
                                                Tiempo tiempo = null;
                                                foreach (TreeNode childNodeTiempo in childNode.Nodes)
                                                {
                                                    if (childNodeTiempo.Checked)
                                                    {
                                                        tiempo = sistema.retornarTiempoEntrega(Int32.Parse(childNodeTiempo.Tag.ToString()));
                                                    }
                                                }

                                                TiempoEntrega tiempoEntrega = new TiempoEntrega();
                                                tiempoEntrega.Tiempo = tiempo;

                                                tiempoEntrega.Precio = calcularDescuento(tiempoEntrega.Tiempo.Precio);


                                                if (!tieneOtroAgregado)
                                                {
                                                    tiempoEntrega.SetComponent(item);
                                                    agregadoAnterior = tiempoEntrega;
                                                    tieneOtroAgregado = true;
                                                }
                                                else
                                                {
                                                    tiempoEntrega.SetComponent(agregadoAnterior);
                                                    agregadoAnterior = tiempoEntrega;
                                                    tieneOtroAgregado = true;
                                                }
                                                agregadoCopia = tiempoEntrega;
                                            }
                                            catch (Exception ex) { }
                                            break;
                                        }
                                    case "ContenidoRelacionado":
                                        {
                                            agregadoCopia = sistema.retornaAgregadoParaItem(nodo.Tag.ToString(), typeof(ContenidoRelacionado));
                                            agregadoCopia.Precio = calcularDescuento(agregadoCopia.Precio);
                                            if (!tieneOtroAgregado)
                                            {
                                                agregadoCopia.SetComponent(item);
                                                agregadoAnterior = agregadoCopia;
                                                tieneOtroAgregado = true;
                                            }
                                            else
                                            {
                                                agregadoCopia.SetComponent(agregadoAnterior);
                                                agregadoAnterior = agregadoCopia;
                                                tieneOtroAgregado = true;
                                            }

                                            break;
                                        }
                                    default:
                                        {
                                            agregadoCopia = sistema.retornaAgregadoGiftParaItem(childNode.Tag.ToString(), typeof(Gift));
                                            agregadoCopia.Precio = calcularDescuento(agregadoCopia.Precio);
                                            if (!tieneOtroAgregado)
                                            {
                                                agregadoCopia.SetComponent(item);
                                                agregadoAnterior = agregadoCopia;
                                                tieneOtroAgregado = true;
                                            }
                                            else
                                            {
                                                agregadoCopia.SetComponent(agregadoAnterior);
                                                agregadoAnterior = agregadoCopia;
                                                tieneOtroAgregado = true;
                                            }

                                            break;
                                        }
                                }

                            }

                        }


                        listaComponentes.Add(agregadoCopia);
                        listSeleccionados.Items.Add(agregadoCopia.devolverNombreItem().ToString());
                    }// end valido
                    else
                    {
                        MessageBox.Show("Debe seleccionar Acceso Online o Tiempo de Entrega para "+ nodo.Tag, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }

            }            
        }

        private double calcularDescuento(Double precio)
        {
            try
            {
                Usuario usuario = sistema.Usuario_loguado;
                int descuento = (usuario.Puntos / 100);
                
                double retorno = 0;
                if (descuento != 0)
                {                   
                    if (descuento > 10)
                        descuento = 10;

                    int descuento_final = 100 - descuento;
                    double cuenta = (double)descuento_final / (double)100;

                    retorno = precio * cuenta;
                }
                else
                    retorno = precio;
                
                return retorno;
                
            }
            catch (Exception ex)
            {
                return 0;
            }
        }

        private void FormDisplayItems_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }
       
       
    }
}
